package com.edu.exam.entity.examination.online;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.edu.exam.enums.examination.StatisticType;
import com.edu.exam.enums.examination.StatisticPeriod;
import com.edu.exam.enums.examination.StatisticStatus;

/**
 * 会话统计实体类
 *
 * <p>会话统计实体用于记录和统计考试会话过程中的各类数据，包括登录统计、
 * 答题统计、时间统计、性能统计等。为考试质量分析和系统优化提供数据支持。</p>
 *
 * <p>核心功能：
 * - 登录统计：学生登录情况、登录时间、登录异常等统计
 * - 答题统计：答题进度、答题时间、答题正确率等统计
 * - 时间统计：考试时间使用、延时时长、提前交卷等时间统计
 * - 性能统计：系统性能、网络状况、客户端性能等统计
 * - 异常统计：异常情况、错误类型、处理结果等异常统计</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class SessionStatistics {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 会话ID
     *
     * <p>关联的考试会话ID，标识统计数据所属的会话。
     * 与ExamSession实体建立一对一关系。</p>
     */
    @Column(name = "session_id", nullable = false, length = 32, unique = true)
    private String sessionId;

    /**
     * 统计类型
     *
     * <p>统计数据的类型标识。
     * 支持的类型：LOGIN（登录统计）、ANSWER（答题统计）、TIME（时间统计）、
     * PERFORMANCE（性能统计）、EXCEPTION（异常统计）等。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "statistic_type", nullable = false, length = 30)
    private StatisticType statisticType;

    /**
     * 统计指标
     *
     * <p>具体的统计指标名称。
     * 用于标识统计的具体内容和含义。</p>
     */
    @Column(name = "statistic_metric", nullable = false, length = 100)
    private String statisticMetric;

    /**
     * 统计值
     *
     * <p>统计指标的数值。
     * 支持整数、浮点数、百分比等多种数值格式。</p>
     */
    @Column(name = "statistic_value")
    private BigDecimal statisticValue;

    /**
     * 统计单位
     *
     * <p>统计值的单位。
     * 如：次、分钟、百分比、KB等。</p>
     */
    @Column(name = "statistic_unit", length = 20)
    private String statisticUnit;

    /**
     * 统计时间
     *
     * <p>统计数据记录的时间。
     * 用于统计时间跟踪和时序分析。</p>
     */
    @Column(name = "statistic_time", nullable = false)
    private LocalDateTime statisticTime;

    /**
     * 统计周期
     *
     * <p>统计数据的周期类型。
     * 支持的周期：REAL_TIME（实时）、HOURLY（小时）、DAILY（日）、TOTAL（总计）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "statistic_period", nullable = false, length = 20)
    private StatisticPeriod statisticPeriod = StatisticPeriod.REAL_TIME;

    /**
     * 开始时间
     *
     * <p>统计周期的开始时间。
     * 用于定义统计的时间范围。</p>
     */
    @Column(name = "period_start_time")
    private LocalDateTime periodStartTime;

    /**
     * 结束时间
     *
     * <p>统计周期的结束时间。
     * 用于定义统计的时间范围。</p>
     */
    @Column(name = "period_end_time")
    private LocalDateTime periodEndTime;

    /**
     * 相关对象ID
     *
     * <p>统计数据相关的对象ID（如学生ID、题目ID等）。
     * 用于细粒度的统计关联。</p>
     */
    @Column(name = "related_object_id", length = 32)
    private String relatedObjectId;

    /**
     * 相关对象类型
     *
     * <p>相关对象的类型标识。
     * 如：STUDENT（学生）、QUESTION（题目）、ANSWER（答案）等。</p>
     */
    @Column(name = "related_object_type", length = 30)
    private String relatedObjectType;

    /**
     * 统计标签
     *
     * <p>统计数据的标签，JSON格式。
     * 用于统计的分类、过滤和聚合。</p>
     */
    @Column(name = "statistic_tags", columnDefinition = "TEXT")
    private String statisticTags;

    /**
     * 统计描述
     *
     * <p>统计数据的详细描述。
     * 用于说明统计数据的含义和计算方法。</p>
     */
    @Column(name = "statistic_description", length = 500)
    private String statisticDescription;

    /**
     * 数据来源
     *
     * <p>统计数据的来源标识。
     * 如：SYSTEM（系统自动）、MANUAL（手动录入）、IMPORT（导入）等。</p>
     */
    @Column(name = "data_source", length = 30)
    private String dataSource = "SYSTEM";

    /**
     * 计算公式
     *
     * <p>统计数据的计算公式。
     * 用于说明统计数据的计算逻辑。</p>
     */
    @Column(name = "calculation_formula", length = 500)
    private String calculationFormula;

    /**
     * 比较基准
     *
     * <p>用于比较的基准值。
     * 如历史平均值、目标值等。</p>
     */
    @Column(name = "comparison_baseline")
    private BigDecimal comparisonBaseline;

    /**
     * 比较结果
     *
     * <p>与基准值比较的结果。
     * 正数表示高于基准，负数表示低于基准。</p>
     */
    @Column(name = "comparison_result")
    private BigDecimal comparisonResult;

    /**
     * 统计精度
     *
     * <p>统计数据的精度（小数位数）。
     * 用于控制统计值的显示精度。</p>
     */
    @Column(name = "statistic_precision")
    private Integer statisticPrecision = 2;

    /**
     * 最小值
     *
     * <p>统计指标的最小值。
     * 用于统计范围分析。</p>
     */
    @Column(name = "min_value")
    private BigDecimal minValue;

    /**
     * 最大值
     *
     * <p>统计指标的最大值。
     * 用于统计范围分析。</p>
     */
    @Column(name = "max_value")
    private BigDecimal maxValue;

    /**
     * 平均值
     *
     * <p>统计指标的平均值。
     * 用于统计集中趋势分析。</p>
     */
    @Column(name = "avg_value")
    private BigDecimal avgValue;

    /**
     * 中位数
     *
     * <p>统计指标的中位数。
     * 用于统计集中趋势分析。</p>
     */
    @Column(name = "median_value")
    private BigDecimal medianValue;

    /**
     * 标准差
     *
     * <p>统计指标的标准差。
     * 用于统计离散程度分析。</p>
     */
    @Column(name = "std_deviation")
    private BigDecimal stdDeviation;

    /**
     * 样本数量
     *
     * <p>统计数据的样本数量。
     * 用于统计可靠性评估。</p>
     */
    @Column(name = "sample_count")
    private Integer sampleCount;

    /**
     * 统计状态
     *
     * <p>统计数据的状态。
     * 支持的状态：PENDING（待处理）、CALCULATING（计算中）、COMPLETED（已完成）、ERROR（错误）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "statistic_status", nullable = false, length = 20)
    private StatisticStatus statisticStatus = StatisticStatus.COMPLETED;

    /**
     * 异常信息
     *
     * <p>统计过程中的异常信息。
     * 记录统计计算的错误和异常情况。</p>
     */
    @Column(name = "error_message", columnDefinition = "TEXT")
    private String errorMessage;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    // ===== 外部枚举引用 =====
    // StatisticType、StatisticPeriod 和 StatisticStatus 枚举已迁移到 com.edu.exam.enums.examination 包中

}